﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace SPMS.Utility
{
    /// <summary>
    /// IO处理辅助类
    /// </summary>
    /// <remarks></remarks>
    /// <history>
    /// [ValentineNing]   2010/07/27 14:16    Created
    /// </history>
    public static class IoUtility
    {
        /// <summary>
        /// 删除指定的文件。如果指定的文件不存在，则不引发异常。（可以处理只读文件）
        /// </summary>
        /// <param name="path">要删除的文件的名称。</param>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2010/07/27 14:17    Created
        /// </history>
        public static void DeleteFile(string path)
        {

            // 去除标记（主要是只读）
            SafeClearFileAttributes(path);

            // 执行删除
            File.Delete(path);
        }

        /// <summary>
        /// 从指定路径删除空目录。（可以处理含有只读文件的文件夹）
        /// </summary>
        /// <param name="path">要移除的空目录的名称。此目录必须为可写或为空。</param>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2010/07/27 15:34    Created
        /// </history>
        public static void DeleteDirectory(string path)
        {
            DeleteDirectory(path, false);
        }

        /// <summary>
        /// 删除指定的目录并（如果指示）删除该目录中的任何子目录。（可以处理含有只读文件的文件夹）
        /// </summary>
        /// <param name="path">要移除的目录的名称。</param>
        /// <param name="recursive">若要移除 path 中的目录、子目录和文件，则为<c>true</c>；否则为<c>false</c> </param>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2010/07/27 15:34    Created
        /// </history>
        public static void DeleteDirectory(string path, bool recursive)
        {

            // 去除标记（主要是只读）
            SafeClearDirectoryAttributes(path);

            // 执行删除
            Directory.Delete(path, recursive);
        }

        /// <summary>
        /// 去掉文件的属性。如果指定的文件不存在，或发生错误也不会扔出异常。
        /// </summary>
        /// <param name="path">要处理的文件的名称。</param>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2010/07/27 14:19    Created
        /// </history>
        private static void SafeClearFileAttributes(string path)
        {

            // 如果文件存在则设置属性为Normal
            if (File.Exists(path))
            {
                try
                {
                    File.SetAttributes(path, FileAttributes.Normal);
                }
                catch
                {
                    // 不作处理
                }
            }
        }

        /// <summary>
        /// 去掉文件夹和其下子文件/文件夹的属性。如果指定的文件夹不存在，或发生错误也不会扔出异常。
        /// </summary>
        /// <param name="path">要处理的文件夹的名称。</param>
        /// <remarks></remarks>
        /// <history>
        /// [ValentineNing]   2010/07/27 15:38    Created
        /// </history>
        private static void SafeClearDirectoryAttributes(string path)
        {
            // 如果文件夹存在则执行操作
            if (Directory.Exists(path))
            {
                try
                {
                    // 依次将所有子文件的属性设置为Normal
                    foreach (string file in Directory.GetFiles(path, "*", SearchOption.AllDirectories))
                    {
                        try
                        {
                            SafeClearFileAttributes(file);
                        }
                        catch
                        {
                            // 不作处理
                        }
                    }
                }
                catch
                {
                    // 不作处理
                }

            }
        }
    }

}
